package nayasis.common.context;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * Context ThreadLocal
 *
 * @author nayasis
 *
 */
public final class ContextThreadLocal {

	private ContextThreadLocal() {}

	// 전역변수
	private static final ThreadLocal<Map<String, Object>> threadLocal = new ThreadLocal<Map<String, Object>>() {
	     public Map<String, Object> initialValue() {
	           return new HashMap<String, Object>();
	     }
	};

	/**
	 * key 값으로 저장된 object를 가져온다.
	 *
	 * @param key key값
	 * @return key 값으로 저장된 object
	 */
	public static Object get( String key ) {
		return threadLocal.get().get( key );
	}

	/**
	 * key 값으로 object를 저장한다.
	 *
	 * @param key   key값
	 * @param value 저장할 값
	 */
	public static void set( String key, Object value ) {
		threadLocal.get().put( key, value );
	}

	/**
	 * key 값으로 저장된 object를 삭제한다.
	 *
	 * @param key key값
	 */
	public static void remove( String key ) {
		threadLocal.get().remove( key );
	}

	/**
	 * key 값으로 저장된 object가 존재하는지 여부를 확인한다.
	 *
	 * @param key key값
	 * @return key 값으로 저장된 object 존재여부
	 */
	public static boolean containsKey( String key ) {
		return threadLocal.get().containsKey( key );
	}

	/**
	 * 내부 참조 데이터를 모두 제거한다.
	 */
	public static void clear() {
		threadLocal.get().clear();
	}

	/**
	 * 저장된 key값의 목록을 얻는다.
	 *
	 * @return key값 목록
	 */
	public static List<String> getKeyList() {

		Set<String> keySet = threadLocal.get().keySet();

		List<String> result = new ArrayList<String>();

		for( String key : keySet ) {
			result.add( key );
		}

		return result;

	}

}
